#ifndef GLTXT_H
#define GLTXT_H

#ifdef __cplusplus
#define CFUN extern "C"
#else 
#define CFUN
#endif

#ifdef __WIN32
#define VIDEOMERGE_API
#else
#define VIDEOMERGE_API
#endif

#include"comm.h"

typedef struct  tagGLText GLText, * PGLText;

/* 初始、反初始化freetype */
CFUN VIDEOMERGE_API int init_ftlib();
CFUN VIDEOMERGE_API void unInit_ftlib();

/**
 *  设置备选字体
 * @remark
 * 备选字体 : 如果在当前设置的字体中找不到字形时，会去备选字体中找。 
 * eg.
 * 设置当前字体为一个中文字体，但是中文字体没有阿拉伯字形。 可把一个阿拉伯字体设置为备选字体，这样就可以同时显示中文和阿拉伯文字
 * @note
 * 备选字体为全局的，创建一个文字时，当前创建的文字为当前的备选字体列表。
 */
CFUN VIDEOMERGE_API int setDefFonts(const char * fnames[], int fcount);

/* 创建删除文字 */
CFUN VIDEOMERGE_API PGLText gltxtCreateOne();
CFUN VIDEOMERGE_API void gltxtDelete(PGLText gltxt);

/* 释放一些缓存（用在有大量的文字，可以把当前不活跃的文字缓存释放掉) */
CFUN VIDEOMERGE_API void gltxtClearCache(PGLText gltxt);

/**
 * 设置一个字内动画的shader
 * @note 
 *  NULL 表示设置回默认值 
*/
CFUN VIDEOMERGE_API int __setText_ShaderAni(PGLText gltxt, const char* ftfsMask,const char*ftvsMoveTo);

/**
 * 设置一个花字shader
 * @note 
 *  NULL 表示设置回默认值 
*/
CFUN VIDEOMERGE_API int __setText_ShaderColor(PGLText gltxt, const char* screenfsColor);

/**
 * 获取文字buffer大小
*/
CFUN VIDEOMERGE_API void __getBufSize(PGLText gltxt, int* width, int* height);

CFUN VIDEOMERGE_API int __setText_FontFile(PGLText gltxt, const char* str);

/** 
 * 设置行高 (这个可对应阿里云的字号)
 * */
CFUN VIDEOMERGE_API int __setText_setHeightf(PGLText gltxt, double height);

/**
 *  设置总高 
 *  @note
 *  设置总高时，要把其它属性都要先设置完了，最后设置总高
 * */
CFUN VIDEOMERGE_API int __setText_setHeight0f(PGLText gltxt, double height);

/**
 *  设置总宽 
 * @return
 *   误差值
 * @note
 *  设置总宽时，要把其它属性都要先设置完了，最后设置总宽
 *  误差避免不了，比如设置200宽度，最终给出的可能是198（阿里云的误差更大，至少有5~20的误差,应该算bug了；抠鼻子） 
 * */
CFUN VIDEOMERGE_API double __setText_setWidth0f(PGLText gltxt, double width);

CFUN VIDEOMERGE_API int __setText_text(PGLText gltxt, const char* str);

/**
 * 是否开启垂直排版
*/
CFUN VIDEOMERGE_API void _gltxt_vertlayout(PGLText gltxt,int bvert);

/**
* 设置颜色 
* @param index
*   0 字体颜色 *
*	1 描边1颜色 *
*	2 描边2颜色 *
*	3 描边3颜色 *
*	4 阴影颜色
*	5 发光颜色
* @param color 颜色值 
*	颜色格式 : 0xAABBGGRR
*/
CFUN VIDEOMERGE_API int __setText_color(PGLText gltxt, unsigned int color, int index);

CFUN VIDEOMERGE_API int __setText_shadowfuzziness(PGLText gltxt, double shadowfuzziness);

/** 
 * 设置描边
 * @param outlineWidth
 *  描边宽度
 * @param index
 *  描边下标，支持3个描边
*/
CFUN VIDEOMERGE_API int __setText_outlineWidth(PGLText gltxt, double outlineWidth,int index);

/**
 * 设置斜体
 * @param lean 倾斜度 建议0.3
*/
CFUN VIDEOMERGE_API int __setText_lean(PGLText gltxt, double lean);

/**
 * 设置加粗
 * @param embolden 加粗比率 建议0.3
*/
CFUN VIDEOMERGE_API int __setText_emboldenf(PGLText gltxt, double embolden);

/**
 * 是否开启下划线
*/
CFUN VIDEOMERGE_API int __setText_underline(PGLText gltxt, int underline);

/**
 * 是否开启发光效果
*/
CFUN VIDEOMERGE_API int __setText_light(PGLText gltxt, int light);

/**
 * 设置发光扩散程度
 * @param spread 扩散程序
 * @note
 *  spread 值越大，越耗时，建议 0. ~ 2. 
 *  spread 值过大时，可能边界有截断
*/
CFUN VIDEOMERGE_API int __setText_lightSpread(PGLText gltxt, float spread);

/**
 * 设置阴影
 * @param shadow 是否开启阴影
 * @param ofx,ofy 阴影偏移
*/
CFUN VIDEOMERGE_API int __setText_shadow(PGLText gltxt, int shadow, double ofx, double ofy);

/**
 * 设置对齐方式
 * @param align 0 左对齐 1 居中 2 右对齐
 * @note 
 *  单行的话对齐没有意义
*/
CFUN VIDEOMERGE_API int __setText_align(PGLText gltxt, int align);

/* 设置动画状态 */
CFUN VIDEOMERGE_API int __setText_status(PGLText gltxt, double time, double duration);

/* 行距 */
CFUN  int __setText_leading(PGLText gltxt, float leading);

/* 字距 */
CFUN  int __setText_letterSpace(PGLText gltxt, float letterSpace);

/* 生成文字动画 */
CFUN int gltxtDoAni(PGLText gltxt,double perc,double duration);

#endif
